<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>GROOPS - GNSS precise point positioning (PPP)</title>

    <!-- JQuery and Popper -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <!-- Bootstrap -->
    <!-- https://getbootstrap.com/docs/4.1/examples/ -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

    <!-- Mathjax -->
    <script type="text/x-mathjax-config">
    MathJax.Hub.Config({tex2jax: {inlineMath: [ ['$','$'] ],
                                  displayMath: [ ["\\[","\\]"] ],
                                  processEscapes: true},
                        TeX:     {Macros: {M: ["{\\mathbf #1}",1]},
                                  equationNumbers: {autoNumber: "all"}  }});
    </script>
    <script async src="https://cdn.jsdelivr.net/npm/mathjax@2.7.7/MathJax.js?config=TeX-AMS_CHTML" integrity="sha384-e/4/LvThKH1gwzXhdbY2AsjR3rm7LHWyhIG5C0jiRfn8AN2eTN5ILeztWw0H9jmN" crossorigin="anonymous"></script>

    <!-- lunr -->
    <script src="https://cdn.jsdelivr.net/npm/lunr@2.3.8/lunr.min.js" integrity="sha384-vRQ9bDyE0Wnu+lMfm57BlYLO0/XauFuKpVsZPs7KEDwYKktWi5+Kz3MP8++DFlRY" crossorigin="anonymous"></script>

    <!-- Mustache -->
    <script src="https://cdn.jsdelivr.net/npm/mustache@4.0.1/mustache.min.js" integrity="sha384-0PLEZVBpOQ+Kqw3anJWSNWvRxpEFt02tSpBvyRsA4WcvX/OTldWdXxGLVLvh954H" crossorigin="anonymous"></script>

    <!-- GROOPS Stylesheet -->
    <link rel="stylesheet" href="static/groops.css"/>

    <!-- icon -->
    <link rel="icon" href="static/groops_icon.png">

</head>
<body>
    <header>
        <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
            <div class="container">
              <a class="navbar-brand" href="index.html"><img class="logo" src="static/groops_white.svg"></a>
              <div class="collapse navbar-collapse" id="mainNavbar">
                <ul class="navbar-nav mr-auto">
                  <li class="nav-item">
                    <a class="nav-link" href="programType.html">Programs</a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="classes.html">Classes</a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="general.parser.html">Parser</a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="general.fileFormat.html">File Formats</a>
                  </li>
                </ul>
              </div>
                <form class="form-inline my-2 my-lg-0" action="search.html" id="searchTools">
                  <input class="form-control mr-sm-2" placeholder="Search" name="searchTerms" method="GET" value="" type="text" id="searchBox">
                  <button class="btn btn-secondary my-2 my-sm-0" type="submit" id="searchButton">Search</button>
                </form>
              <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="Toggle navigation" style="">
                <span class="navbar-toggler-icon"></span>
              </button>
            </div>
        </nav>
    </header>
    <main class="container px-0 pt-2 top-buffer">
        <div id="content" class="container">
            <h1 id="cookbook.gnssPpp">GNSS precise point positioning (PPP)</h1><p>
This cookbook chapter describes an example of GNSS precise point positioning (PPP) for a ground station using GPS, GLONASS, and Galileo.
For information on how to generate the GNSS products (orbits, clocks, signal biases, etc.) required for PPP,
see the cookbook <a class="groops-ref" href="cookbook.gnssNetwork.html">GNSS satellite orbit determination and station network analysis</a>.</p><p>Scientific details about the underlying processing approach and the applied parametrizations, models, and corrections
can be found in a doctoral thesis available under DOI <a href="https://doi.org/10.3217/978-3-85125-885-1">10.3217/978-3-85125-885-1</a>.</p><p>An example scenario for this task is available at <a href="https://ftp.tugraz.at/outgoing/ITSG/groops/scenario/scenarioGnssPPP.zip" target="_blank">https://ftp.tugraz.at/outgoing/ITSG/groops/scenario/scenarioGnssPPP.zip</a>.
It includes GROOPS scripts and data for the example, but not the general GROOPS data and metadata found at <a href="https://ftp.tugraz.at/outgoing/ITSG/groops" target="_blank">https://ftp.tugraz.at/outgoing/ITSG/groops</a> (data folder or zipped archive).
The scenario generally represents what is described in this cookbook, but may slightly differ in certain settings.</p><p><h2 id="metadata">Data preparation</h2><p>
Most of the required metadata files are provided in GROOPS file formats at <a href="https://ftp.tugraz.at/outgoing/ITSG/groops" target="_blank">https://ftp.tugraz.at/outgoing/ITSG/groops</a>.
These files are regularly updated.</p><p>Data that has to be gathered from other sources comprises:
<ul>

  <li><b>Receiver observations</b>: GNSS measurements converted from RINEX format (see <a class="groops-program" href="RinexObservation2GnssReceiver.html">RinexObservation2GnssReceiver</a>)
  </li><li>
<b>Precise orbits</b>: precise orbits in CRF for orbit integration (see <a class="groops-program" href="Sp3Format2Orbit.html">Sp3Format2Orbit</a>)
  </li><li>
<b>Precise clocks</b>: precise clocks (see <a class="groops-program" href="GnssClockRinex2InstrumentClock.html">GnssClockRinex2InstrumentClock</a>)
  </li><li>
<b>Attitude</b>: rotation from body frame to CRF (see <a class="groops-program" href="SimulateStarCameraGnss.html">SimulateStarCameraGnss</a> or <a class="groops-program" href="GnssOrbex2StarCamera.html">GnssOrbex2StarCamera</a>)
  </li><li>
<b>Signal biases</b>: code (and phase) biases (see <a class="groops-program" href="GnssSinexBias2SignalBias.html">GnssSinexBias2SignalBias</a>)
</li></ul>

Receiver observations, precise satellite orbits and clocks, and possibly attitude and signal biases can be downloaded from the
<a href="https://igs.org/data-products-overview/">IGS Data Centers</a>.
GPS, GLONASS, and Galileo orbits, clocks, attitude, and signal biases for the period 1994-2020 are also available as part of
<a href="https://doi.org/10.3217/dataset-4528-0723-0867">Graz University of Technology's contribution to IGS repro3</a>.</p><p>The <a href="https://ftp.tugraz.at/outgoing/ITSG/groops/scenario/scenarioGnssPPP.zip">example scenario</a> includes a small set of this data.
The script <code>010groopsConvert.xml</code> can be used to convert these external formats into GROOPS formats.</p><p>Prepare a <a class="groops-file" href="fileFormat_stringList.html">station list file</a> that contains the stations (one per line) to be processed.</p><p><h2 id="processing">Processing of a ground station</h2><p>
The script <code>02groopsGnssProcessing.xml</code> in the <a href="https://ftp.tugraz.at/outgoing/ITSG/groops/scenario/scenarioGnssPPP.zip">example scenario</a>
implements the following steps and settings.</p><p>These are the settings for <a class="groops-program" href="GnssProcessing.html">GnssProcessing</a>. If not otherwise stated use the default values.</p><p>The first step is setting the processing sampling, in this example it is 30 seconds.
The processing interval usually is a single 24-hour day,
<a class="groops-class" href="timeSeriesType.html#uniformSampling">timeSeries:uniformSampling</a> with <strong class="groops-config-element">timeStart</strong>=<code>&lt;mjd></code>,
<strong class="groops-config-element">timeEnd</strong>=<code>&lt;mjd>+1</code>, <strong class="groops-config-element">sampling</strong>=<code>30/86400</code> (processing sampling).</p><p>Add the appropriate <a class="groops-class" href="gnssTransmitterGeneratorType.html#gnss">transmitters:gnss</a> (e.g. GPS, GLONASS, and Galileo)
and provide the required files (from <a class="groops-ref" href="cookbook.gnssPpp.html#metadata">Data preparation</a>):
<ul>

  <li><a class="groops-class" href="fileFormat_instrument.html">inputfileOrbit</a>
  </li><li>
<a class="groops-class" href="fileFormat_instrument.html">inputfileAttitude</a>
  </li><li>
<a class="groops-class" href="fileFormat_instrument.html">inputfileClock</a>
</li></ul>
</p><p>The following settings are needed in <a class="groops-class" href="gnssReceiverGeneratorType.html#stationNetwork">receiver:stationNetwork</a>:
<ul>

   <li><a class="groops-class" href="fileFormat_stringList.html">inputfileStationList</a>: list of all stations to be processed
   </li><li>
<a class="groops-class" href="fileFormat_instrument.html">inputfileObservations</a>: The converted RINEX observation file.
   </li><li>
<a class="groops-class" href="tidesType.html">tidalDisplacement</a>: Use the settings described in <a class="groops-ref" href="gnssReceiverGeneratorType.html#stationNetwork">receiver:stationNetwork</a>.
   </li><li>
<a class="groops-class" href="gnssType.html">useType</a>: We recommend to explicitly specify the signals to be processed
            and to make sure that at least transmitter code biases are provided for each of them, e.g. <code>C1CG</code>,
            <code>C1WG</code>, <code>C2WG</code>, <code>L1*G</code>, <code>L2*G</code>, ...).
   </li><li>
<a class="groops-class" href="gnssType.html">excludeType</a>: Signals you might want to exclude are <code>L5*G</code> (GPS L5 phase due to time-variable bias on block IIF satellites), <code>*3*R</code> (GLONASS G3 freq.), <code>*6*E</code> (Galileo E6 freq.)
</li></ul>
</p><p>Add the following <a class="groops-class" href="gnssParametrizationType.html">parametrizations</a>
and define the <strong class="groops-config-element">outputfiles</strong> you are interested in inside each of them:
<ul>

  <li><a class="groops-class" href="gnssParametrizationType.html#ionosphereSTEC">ionosphereSTEC</a>: add a constraint of <strong class="groops-config-element">sigmaSTEC</strong>=<code>40</code>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#ionosphereVTEC">ionosphereVTEC</a>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#clocks">clocks</a>: delete <a class="groops-class" href="platformSelectorType.html">selectTransmitters</a>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#signalBiases">signalBiases</a>: provide <a class="groops-class" href="fileFormat_gnssSignalBias.html">inputfileSignalBiasTransmitter</a> from
        <a class="groops-ref" href="cookbook.gnssPpp.html#metadata">Data preparation</a>.
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#ambiguities">ambiguities</a>: if precise transmitter phase biases are available you can delete <a class="groops-class" href="platformSelectorType.html">estimateTransmitterPhaseBiases</a>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#codeBiases">codeBiases</a>: delete <a class="groops-class" href="platformSelectorType.html">selectTransmitters</a>, set <strong class="groops-config-element">sigmaZeroMeanConstraint</strong>=<code>0</code>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#tecBiases">tecBiases</a>: delete <a class="groops-class" href="platformSelectorType.html">selectTransmitters</a>, set <strong class="groops-config-element">sigmaZeroMeanConstraint</strong>=<code>0</code>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#kinematicPositions">kinematicPositions</a>
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#troposphere">troposphere</a>: select <a class="groops-class" href="troposphereType.html#viennaMapping">troposphere:viennaMapping</a>
        with the appropriate vmf3grid file. Add <a class="groops-class" href="parametrizationTemporalType.html#splines">troposphereWetEstimation:splines</a>
        with linear (<strong class="groops-config-element">degree</strong>=<code>1</code>) 2-hourly splines
        and <a class="groops-class" href="parametrizationTemporalType.html#splines">troposphereGradientEstimation:splines</a> with linear daily splines.
  </li><li>
<a class="groops-class" href="gnssParametrizationType.html#constraints">constraints</a>: loose constraint troposphere estimates,
        <a class="groops-class" href="parameterSelectorType.html#wildcard">parameters:wildcard:type</a>=<code>troposphere*</code>, <strong class="groops-config-element">sigma</strong>=<code>5</code>, and <strong class="groops-config-element">relativeToApriori</strong>=<code>yes</code>
</li></ul>
</p><p>Add the following <a class="groops-class" href="gnssProcessingStepType.html">processingSteps</a>:
<ul>

  <li><a class="groops-class" href="gnssProcessingStepType.html#estimate">estimate</a>: with <strong class="groops-config-element">maxIterationCount</strong>=<code>8</code>
  </li><li>
<a class="groops-class" href="gnssProcessingStepType.html#resolveAmbiguities">resolveAmbiguities</a>
  </li><li>
<a class="groops-class" href="gnssProcessingStepType.html#estimate">estimate</a>: with <strong class="groops-config-element">maxIterationCount</strong>=<code>2</code>
  </li><li>
<a class="groops-class" href="gnssProcessingStepType.html#writeResults">writeResults</a>
</li></ul>
</p><p>When processing multiple stations at the same time, moving <a class="groops-class" href="gnssProcessingStepType.html#estimate">estimate</a>
and <a class="groops-class" href="gnssProcessingStepType.html#resolveAmbiguities">resolveAmbiguities</a> into the processing step
<a class="groops-class" href="gnssProcessingStepType.html#forEachReceiverSeparately">forEachReceiverSeparately</a> sets up and solves
the normal equations independently for each station.</p><p>
</p>

        </div>
    </main>
</body>
</html>
